//题目:
// 给你一个链表的头节点 head ，旋转链表，将链表每个节点向右移动 k 个位置。
#include<iostream>
#include<queue>
#include<unordered_map>
#include<limits.h>
#include<algorithm>

using namespace std;
//代码
// Definition for singly-linked list.
struct ListNode {
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        vector<int> v;
        ListNode* cur=head;
        while(cur)
            v.push_back(cur->val),cur=cur->next;
        //对v里面的元素旋转...哎？ 等等！ 直接用v对head错开赋值不香吗???
        if(v.size()==0 || k%v.size()==0)return head;
        k%=v.size(),cur=head;
        int pos=0;
        while(cur)
        {
            //k>0 : cur对应v倒数第k个元素; k==0 : cur对应v的第pos(从0开始)个
            if(k>0)
                cur->val=v[v.size()-k--],cur=cur->next;
            else
                cur->val=v[pos++],cur=cur->next;
        }
        return head;
    }
};